package com.dragon.common.spring.openapi.customizers.operation;

import com.dragon.common.spring.openapi.AccessTokenHelper;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import org.springdoc.core.customizers.OperationCustomizer;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;

/**
 * @author Chris Chan
 * Create On 2025/8/6 上午10:55
 * Use for: 安全
 * Explain:
 * 安全相关的 Operation 定制器
 * 添加Authorization域
 * 1. 检查方法上的 @AccessToken 注解
 * 2. 检查类上的 @AccessToken 注解
 * 3. 如果方法上有注解，且 required 为 true，则添加安全要求
 * 4. 如果类上有注解，且 required 为 true，则添加安全要求
 * 5. 如果方法上和类上都没有注解，或者 required 为 false，则不添加安全要求
 * 6. 如果方法上有注解，且 required 为 false，则不添加安全要求
 * 7. 如果类上有注解，且 required 为 false，则不添加安全要求
 */
@Component
public class SecurityOperationCustomizer implements OperationCustomizer {

    @Override
    public Operation customize(Operation operation, HandlerMethod method) {
        if (method != null) {

            //检查是否支持
            boolean required = AccessTokenHelper.support(method);

            if (required) {
                // 添加安全要求
                operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION));

                // 可以添加自定义描述
                if (operation.getDescription() == null) {
                    operation.setDescription("访问该接口需要认证");
                } else {
                    operation.setDescription(operation.getDescription() + " [需要认证]");
                }
            }
        }
        return operation;
    }
}
